﻿// Find them, Catch them POJ - 1703.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

//https://vjudge.csgrandeur.cn/problem/POJ-1703

/*
塔杜市警察局决定结束混乱局面，采取行动铲除市内的两个帮派--龙帮和蛇帮。
然而，警方首先需要确定罪犯属于哪个帮派。现在的问题是，给定两个罪犯，他们属于同一个帮派吗？
你必须根据不完整的信息做出判断。(因为歹徒总是秘密行动）。

假设塔都城目前有 N 个（N <= 10^5）罪犯，编号从 1 到 N。当然，其中至少有一个属于龙帮，蛇帮也是如此。
您将依次收到 M（M <= 10^5）条信息，这些信息分为以下两种：

1. D [a] [b］
其中 [a] 和 [b] 是两个罪犯的号码，他们属于不同的帮派。

2. A [a] [b］
其中 [a] 和 [b] 是两个罪犯的编号。这要求您判断 a 和 b 是否属于同一帮派。

输入
输入的第一行包含一个整数 T（1 <= T <= 20），即测试案例的数量。
然后是 T 个测试用例。每个测试用例都以包含两个整数 N 和 M 的一行开始，然后是 M 行，每行包含一条信息，如上所述。
输出
对于每个案例中的每条信息 "A [a] [b]"，你的程序都应根据之前获得的信息给出判断。答案可能是 "同一帮派"、"不同帮派 "和 "尚不确定"。

2
5 5
A 1 2
D 1 2
A 1 2
D 2 4
A 1 4
5 6
A 1 2
D 1 2
A 1 2
D 2 4
A 1 4
A 1 4

Not sure yet.
In different gangs.
In the same gang.

*/

int t, n, m;
const int N = 200020;
int f[N];

void init() {
	for (int i = 0; i < n*2; i++) {
		f[i] = i;
	}
}

int find(int x) {
	if (x == f[x]) return f[x];
	else f[x] = find(f[x]);
	return f[x]; 
}

void merge(int a, int b) {
	a = find(a); b = find(b);
	if (a < b) {
		f[b] = a;
	}
	else {
		f[a] = b;
	}
}


void solve() {
	int a, b; char op[3];
	while (m--) {
		//cin >> op >> a >> b;
		scanf("%s%d%d", op, &a, &b);
		a = find(a); b = find(b);
		int na = find(a + n); int nb = find(b + n);
		if (op[0] == 'A') {
			//询问A
			if (na == nb || a == b) {
				//cout << "In the same gang." << endl;
				printf("In the same gang.\n");
			}
			else if(na==b || nb==a) {
				//cout << "In different gangs." << endl;
				printf("In different gangs.\n");
			}
			else {
				//cout << "Not sure yet." << endl;
				printf("Not sure yet.\n");
			}
		}
		else {
			//信息D
			merge(a, b + n); merge(b, a+n);
		}
	}

	return;
}


int main()
{
	//cin >> t;
	scanf("%d",&t);
	while (t--) {
		//cin >> n >> m;
		scanf("%d%d",&n,&m);
		init();
		solve();
	}

	return 0;
}
 